﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Collections;

namespace Incident_Manager_PUCP
{
    public class GestorServicio
    {

        //Patrón Solitario o Singleton        
        private static GestorServicio pinstancia = null;
        public List<Servicio> servicios = new List<Servicio>();

        public string lastMsg = "";
  

        public static GestorServicio ObtenerInstancia(){
            if (pinstancia == null){
                pinstancia = new GestorServicio();
                Console.WriteLine("GestorServicio");
            }
            else Console.WriteLine("Existe instancia GestorServicio");
            return pinstancia;
        }
        
        protected GestorServicio(){
            
        }

        public bool registrarServicio(Servicio servicio){
            if (servicio != null){
                //Verifica que no exista el mismo código
                if (buscarServicio(servicio.getCodigo()) == null) {                    
                    lastMsg = "Servicio registrado: " + servicio.getNombre();
                    servicios.Add(servicio);
                    return true;
                }
                else {
                    lastMsg = "Ya existe un servicio con el código: " + servicio.getCodigo();
                    return false;
                }
            }
            return false;
        }

        public bool eliminarServicio(string codigo){

            Servicio tempServicio = this.buscarServicio(codigo);

            if (tempServicio != null){
                Console.Write("Servicio removido " + tempServicio.getNombre());
                lastMsg = "Servicio removido " + tempServicio.getNombre();
                return this.servicios.Remove(tempServicio);               
            }
            else{
                Console.Write("Servicio no encotrado " + codigo);
                lastMsg = "Servicio no encotrado " + codigo;
                return false;
            }
            
        }

        //modifica todos los datos excepto el código
        public bool modificarServicio(
            string codigo,
            string nombre,
            string tipo,
            string horarioCobertura,
            string tiempoRespuesta,
            string modoAtencion,
            List<String> tareasServicio,
            string informacionAdicional){

            Servicio tempServicio = this.buscarServicio(codigo);

            if (tempServicio != null) {

                tempServicio.setNombre(nombre);
                tempServicio.setTipo(tipo);
                tempServicio.setHorarioCobertura(horarioCobertura);
                tempServicio.setTiempoRespuesta(tiempoRespuesta);
                tempServicio.setModoAtencion(modoAtencion);
                tempServicio.setTareasServicio(tareasServicio);
                tempServicio.setInformacionAdicional(informacionAdicional);

                lastMsg = "Servicio" + tempServicio.getCodigo() + " actualizado: " + tempServicio.getNombre();

                return true;
            }
            else{                
                lastMsg = "No existe un servicio con el código: " + codigo;

                return false;
            }
        }

        public bool modificarServicio(Servicio servicio) {

            return this.modificarServicio(
                    servicio.getCodigo(),
                    servicio.getNombre(),
                    servicio.getTipo(),
                    servicio.getHorarioCobertura(),
                    servicio.getTiempoRespuesta(),
                    servicio.getModoAtencion(),
                    servicio.getTareasServicio(),
                    servicio.getInformacionAdicional()
                );            
        }


        public Servicio buscarServicio(string codigo){
            Servicio tempServicio = null;

            if (codigo != null)
                tempServicio = this.servicios.Find(
                    delegate(Servicio srv) {
                        return srv.getCodigo() == codigo;
                    }
                );

            return tempServicio;
        
        }

        public List<Servicio> buscarServiciosPorNombre(string nombre) {
            List<Servicio> tempServicios;

            if (nombre != null)
                tempServicios = this.servicios.FindAll(
                    delegate(Servicio srv) {
                        return srv.getNombre().Contains(nombre);
                    }
                );
            else
                tempServicios = servicios;
            
            return tempServicios;
        }

        public List<Servicio> buscarServiciosPorCodigo(string codigo) {
            List<Servicio> tempServicios;

            if (codigo != null)
                tempServicios = this.servicios.FindAll(
                    delegate(Servicio srv) {
                        return srv.getCodigo().Contains(codigo);
                    }
                );
            else
                tempServicios = servicios;

            return tempServicios;
        }


    }
}
